package com.ruoyi.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
import java.util.Date;
import java.util.UUID;

/**
 * Jwt工具类
 */
public class JwtUtil {
    //有效期 1个小时
    public static final Long JWT_TTL=60*60*1000L;
    //设置秘钥明文
    public static final String JWT_KEY="qtummatrix";

    public static String getUUID(){
        String token= UUID.randomUUID().toString().replace("-","");
        return token;
    }

    /**
     * 生成jwt
     * @param subject token中要存放的数据(json格式)
     * @return
     */
    public static String createJWT(String subject){
        JwtBuilder builder=getJwtBuilder(subject,null,getUUID()); //设置过期时间
        return builder.compact();
    }

    /**
     * 生成jwt
     * @param subject token中要存放的数据(json格式)
     * @param ttlMillis token超时时间
     * @return
     */
    public static String createJWT(String subject,Long ttlMillis){
        JwtBuilder builder=getJwtBuilder(subject,ttlMillis,getUUID()); //设置过期时间
        return builder.compact();
    }

    private static JwtBuilder getJwtBuilder(String subject,Long ttlMillis,String uuid){
        SignatureAlgorithm signatureAlgorithm=SignatureAlgorithm.HS256;
        SecretKey secretKey=generalKey();
        long nowMillis=System.currentTimeMillis();
        Date now=new Date(nowMillis);
        if(ttlMillis==null){
            ttlMillis=JwtUtil.JWT_TTL;
        }
        long expMillis=nowMillis+ttlMillis;
        Date expDate=new Date(expMillis);
        return Jwts.builder()
                .setId(uuid)         //唯一的ID
                .setSubject(subject)  //主题 可以是JSON数据
                .setIssuer("sg")   //签发者
                .setIssuedAt(now)   //签发时间
                .signWith(signatureAlgorithm,secretKey)  //使用HS256对称加密算法签名，第二个参数为秘钥
                .setExpiration(expDate);
    }

    /**
     * 生成jwt
     * @param id
     * @param subject token中要存放的数据(json格式)
     * @param ttlMillis token超时时间
     * @return
     */
    public static String createJWT(String id,String subject,Long ttlMillis){
        JwtBuilder builder=getJwtBuilder(subject,ttlMillis,id); //设置过期时间
        return builder.compact();
    }

    /**
     * 生成加密后的秘钥 secretKey
     * @return
     */
    public static SecretKey generalKey(){
        byte[] encodeKey= Base64.getDecoder().decode(JwtUtil.JWT_KEY);
        SecretKey key=new SecretKeySpec(encodeKey,0,encodeKey.length,"AES");
        return key;
    }

    /**
     * 解析
     * @param jwt
     * @return
     * @throws Exception
     */
    public static Claims parseJWT(String jwt) throws  Exception{
        SecretKey secretKey=generalKey();
        return Jwts.parser()
                .setSigningKey(secretKey)
                .parseClaimsJws(jwt)
                .getBody();
    }
}
